///*
// * Copyright 2002-2019 the original author or authors.
// *
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// *
// *      https://www.apache.org/licenses/LICENSE-2.0
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// */
//package org.springframework.security.oauth.samples.config;
//
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.security.oauth2.client.OAuth2AuthorizationContext;
//import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest;
//import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
//import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
//import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder;
//import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
//import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
//import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
//import org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction;
//import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
//import org.springframework.util.StringUtils;
//import org.springframework.web.reactive.function.client.WebClient;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.Collections;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.function.Function;
//
///**
// * @author Joe Grandja
// */
//@Configuration
//public class WebClientConfig {
//
//	@Bean
//	WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
//		ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
//				new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
//		return WebClient.builder()
//				.apply(oauth2Client.oauth2Configuration())
//				.build();
//	}
//
//	@Bean
//	OAuth2AuthorizedClientManager authorizedClientManager(ClientRegistrationRepository clientRegistrationRepository,
//															OAuth2AuthorizedClientRepository authorizedClientRepository) {
//		OAuth2AuthorizedClientProvider authorizedClientProvider =
//				OAuth2AuthorizedClientProviderBuilder.builder()
//						.authorizationCode()
//						.refreshToken()
//						.clientCredentials()
//						.password()
//						.build();
//		DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
//				clientRegistrationRepository, authorizedClientRepository);
//		authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
//
//		// For the `password` grant, the `username` and `password` are supplied via request parameters,
//		// so map it to `OAuth2AuthorizationContext.getAttributes()`.
//		authorizedClientManager.setContextAttributesMapper(contextAttributesMapper());
//
//		return authorizedClientManager;
//	}
//
//	private Function<OAuth2AuthorizeRequest, Map<String, Object>> contextAttributesMapper() {
//		return authorizeRequest -> {
//			Map<String, Object> contextAttributes = Collections.emptyMap();
//			HttpServletRequest servletRequest = authorizeRequest.getAttribute(HttpServletRequest.class.getName());
//			String username = servletRequest.getParameter(OAuth2ParameterNames.USERNAME);
//			String password = servletRequest.getParameter(OAuth2ParameterNames.PASSWORD);
//			if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
//				contextAttributes = new HashMap<>();
//
//				// `PasswordOAuth2AuthorizedClientProvider` requires both attributes
//				contextAttributes.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, username);
//				contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, password);
//			}
//			return contextAttributes;
//		};
//	}
//}